home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 November / CPNL0711.ISO / boekhoud / finan / BADGER finance v1.0 beta 2.exe / xampplite / phpMyAdmin / libraries / database_interface.lib.php < prev    next >
PHP Script  |  2006-03-08  |  41KB  |  1,038 lines

  1. <?php
  2. /* $Id: database_interface.lib.php,v 2.39.2.2 2006/03/08 17:54:29 lem9 Exp $ */
  3. // vim: expandtab sw=4 ts=4 sts=4:
  4.  
  5. /**
  6.  * Common Option Constants For DBI Functions
  7.  */
  8. // PMA_DBI_try_query()
  9. define('PMA_DBI_QUERY_STORE',       1);  // Force STORE_RESULT method, ignored by classic MySQL.
  10. define('PMA_DBI_QUERY_UNBUFFERED',  2);  // Do not read whole query
  11. // PMA_DBI_get_variable()
  12. define('PMA_DBI_GETVAR_SESSION', 1);
  13. define('PMA_DBI_GETVAR_GLOBAL', 2);
  14.  
  15. /**
  16.  * Loads the mysql extensions if it is not loaded yet
  17.  *
  18.  * @param   string  $extension  mysql extension to load
  19.  */
  20. function PMA_DBI_checkAndLoadMysqlExtension( $extension = 'mysql' ) {
  21.     if ( ! function_exists( $extension . '_connect' ) ) {
  22.         PMA_dl( $extension );
  23.         // check whether mysql is available
  24.         if ( ! function_exists( $extension . '_connect' ) ) {
  25.             return false;
  26.         }
  27.     }
  28.  
  29.     return true;
  30. }
  31.  
  32.  
  33. /**
  34.  * check for requested extension
  35.  */
  36. if ( ! PMA_DBI_checkAndLoadMysqlExtension( $GLOBALS['cfg']['Server']['extension'] ) ) {
  37.  
  38.     // if it fails try alternative extension ...
  39.     // and display an error ...
  40.  
  41.     // TODO 2.7.1: add different messages for alternativ extension
  42.     // and complete fail (no alternativ extension too)
  43.     $GLOBALS['PMA_errors'][] =
  44.         sprintf( PMA_sanitize( $GLOBALS['strCantLoad'] ),
  45.             $GLOBALS['cfg']['Server']['extension'] )
  46.         .' - <a href="./Documentation.html#faqmysql" target="documentation">'
  47.         .$GLOBALS['strDocu'] . '</a>';
  48.  
  49.     if ( $GLOBALS['cfg']['Server']['extension'] === 'mysql' ) {
  50.         $alternativ_extension = 'mysqli';
  51.     } else {
  52.         $alternativ_extension = 'mysql';
  53.     }
  54.  
  55.     if ( ! PMA_DBI_checkAndLoadMysqlExtension( $alternativ_extension ) ) {
  56.         // if alternativ fails too ...
  57.         header( 'Location: error.php'
  58.                 . '?lang='  . urlencode( $available_languages[$lang][2] )
  59.                 . '&char='  . urlencode( $charset )
  60.                 . '&dir='   . urlencode( $text_dir )
  61.                 . '&type='  . urlencode( $strError )
  62.                 . '&error=' . urlencode(
  63.                     sprintf( $GLOBALS['strCantLoad'],
  64.                         $GLOBALS['cfg']['Server']['extension'] )
  65.                     .' - [a@./Documentation.html#faqmysql@documentation]'
  66.                     .$GLOBALS['strDocu'] . '[/a]' )
  67.                 . '&' . SID
  68.                  );
  69.         exit();
  70.     }
  71.  
  72.     $GLOBALS['cfg']['Server']['extension'] = $alternativ_extension;
  73.     unset( $alternativ_extension );
  74. }
  75.  
  76. /**
  77.  * Including The DBI Plugin
  78.  */
  79. require_once('./libraries/dbi/' . $GLOBALS['cfg']['Server']['extension'] . '.dbi.lib.php');
  80.  
  81. /**
  82.  * Common Functions
  83.  */
  84. function PMA_DBI_query($query, $link = null, $options = 0) {
  85.     $res = PMA_DBI_try_query($query, $link, $options)
  86.         or PMA_mysqlDie(PMA_DBI_getError($link), $query);
  87.     return $res;
  88. }
  89.  
  90. /**
  91.  * converts charset of a mysql message, usally coming from mysql_error(),
  92.  * into PMA charset, usally UTF-8
  93.  * uses language to charset mapping from mysql/share/errmsg.txt
  94.  * and charset names to ISO charset from information_schema.CHARACTER_SETS
  95.  *
  96.  * @uses    $GLOBALS['cfg']['IconvExtraParams']
  97.  * @uses    $GLOBALS['charset']     as target charset
  98.  * @uses    PMA_DBI_fetch_value()   to get server_language
  99.  * @uses    preg_match()            to filter server_language
  100.  * @uses    in_array()
  101.  * @uses    function_exists()       to check for a convert function
  102.  * @uses    iconv()                 to convert message
  103.  * @uses    libiconv()              to convert message
  104.  * @uses    recode_string()         to convert message
  105.  * @uses    mb_convert_encoding()   to convert message
  106.  * @param   string  $message
  107.  * @return  string  $message
  108.  */
  109. function PMA_DBI_convert_message( $message ) {
  110.     // latin always last!
  111.     $encodings = array(
  112.         'japanese'      => 'EUC-JP', //'ujis',
  113.         'japanese-sjis' => 'Shift-JIS', //'sjis',
  114.         'korean'        => 'EUC-KR', //'euckr',
  115.         'russian'       => 'KOI8-R', //'koi8r',
  116.         'ukrainian'     => 'KOI8-U', //'koi8u',
  117.         'greek'         => 'ISO-8859-7', //'greek',
  118.         'serbian'       => 'CP1250', //'cp1250',
  119.         'estonian'      => 'ISO-8859-13', //'latin7',
  120.         'slovak'        => 'ISO-8859-2', //'latin2',
  121.         'czech'         => 'ISO-8859-2', //'latin2',
  122.         'hungarian'     => 'ISO-8859-2', //'latin2',
  123.         'polish'        => 'ISO-8859-2', //'latin2',
  124.         'romanian'      => 'ISO-8859-2', //'latin2',
  125.         'spanish'       => 'CP1252', //'latin1',
  126.         'swedish'       => 'CP1252', //'latin1',
  127.         'italian'       => 'CP1252', //'latin1',
  128.         'norwegian-ny'  => 'CP1252', //'latin1',
  129.         'norwegian'     => 'CP1252', //'latin1',
  130.         'portuguese'    => 'CP1252', //'latin1',
  131.         'danish'        => 'CP1252', //'latin1',
  132.         'dutch'         => 'CP1252', //'latin1',
  133.         'english'       => 'CP1252', //'latin1',
  134.         'french'        => 'CP1252', //'latin1',
  135.         'german'        => 'CP1252', //'latin1',
  136.     );
  137.  
  138.     if ( $server_language = PMA_DBI_fetch_value( 'SHOW VARIABLES LIKE \'language\';', 0, 1 ) ) {
  139.         $found = array();
  140.         if ( preg_match( '&(?:\\\|\\/)([^\\\\\/]*)(?:\\\|\\/)$&i', $server_language, $found )) {
  141.             $server_language = $found[1];
  142.         }
  143.     }
  144.  
  145.     if ( ! empty( $server_language ) && isset( $encodings[$server_language] ) ) {
  146.         if ( function_exists( 'iconv' ) ) {
  147.             $message = iconv( $encodings[$server_language],
  148.                 $GLOBALS['charset'] . $GLOBALS['cfg']['IconvExtraParams'], $message);
  149.         } elseif ( function_exists( 'recode_string' ) ) {
  150.             $message = recode_string( $encodings[$server_language] . '..'  . $GLOBALS['charset'],
  151.                 $message );
  152.         } elseif ( function_exists( 'libiconv' ) ) {
  153.             $message = libiconv( $encodings[$server_language], $GLOBALS['charset'], $message );
  154.         } elseif ( function_exists( 'mb_convert_encoding' ) ) {
  155.             // do not try unsupported charsets
  156.             if ( ! in_array( $server_language, array( 'ukrainian', 'greek', 'serbian' ) ) ) {
  157.                 $message = mb_convert_encoding( $message, $GLOBALS['charset'],
  158.                     $encodings[$server_language] );
  159.             }
  160.         }
  161.     } else {
  162.         // lang not found, try all
  163.         // what TODO ?
  164.     }
  165.  
  166.     return $message;
  167. }
  168.  
  169. /**
  170.  * returns array with database names
  171.  *
  172.  * @return  array   $databases
  173.  */
  174. function PMA_DBI_get_dblist($link = null)
  175. {
  176.     $dbs_array = PMA_DBI_fetch_result('SHOW DATABASES;', $link);
  177.  
  178.     // Before MySQL 4.0.2, SHOW DATABASES could send the
  179.     // whole list, so check if we really have access:
  180.     if (PMA_MYSQL_INT_VERSION < 40002 || !empty($GLOBALS['cfg']['Server']['hide_db'])) {
  181.         foreach ($dbs_array as $key => $db) {
  182.             if (!@PMA_DBI_select_db($db, $link) || (!empty($GLOBALS['cfg']['Server']['hide_db']) && preg_match('/' . $GLOBALS['cfg']['Server']['hide_db'] . '/', $db))) {
  183.                 unset( $dbs_array[$key] );
  184.             }
  185.         }
  186.         // re-index values
  187.         $dbs_array = array_values( $dbs_array );
  188.     }
  189.  
  190.     return $dbs_array;
  191. }
  192.  
  193. /**
  194.  * returns array with table names for given db
  195.  *
  196.  * @param   string  $database   name of database
  197.  * @param   mixed   $link       mysql link resource|object
  198.  * @return  array   tables names
  199.  */
  200. function PMA_DBI_get_tables($database, $link = null)
  201. {
  202.     return PMA_DBI_fetch_result('SHOW TABLES FROM ' . PMA_backquote($database) . ';',
  203.         null, 0, $link, PMA_DBI_QUERY_STORE);
  204. }
  205.  
  206. /**
  207.  * returns array of all tables in given db or dbs
  208.  * this function expects unqoted names:
  209.  * RIGHT: my_database
  210.  * WRONG: `my_database`
  211.  * WRONG: my\_database
  212.  * if $tbl_is_group is true, $table is used as filter for table names
  213.  * if $tbl_is_group is 'comment, $table is used as filter for table comments
  214.  *
  215.  * <code>
  216.  * PMA_DBI_get_tables_full( 'my_database' );
  217.  * PMA_DBI_get_tables_full( 'my_database', 'my_table' ) );
  218.  * PMA_DBI_get_tables_full( 'my_database', 'my_tables_', true ) );
  219.  * PMA_DBI_get_tables_full( 'my_database', 'my_tables_', 'comment' ) );
  220.  * </code>
  221.  *
  222.  * @uses    PMA_MYSQL_INT_VERSION
  223.  * @uses    PMA_DBI_fetch_result()
  224.  * @uses    PMA_escape_mysql_wildcards()
  225.  * @uses    PMA_backquote()
  226.  * @uses    is_array()
  227.  * @uses    addslashes()
  228.  * @uses    strpos()
  229.  * @uses    strtoupper()
  230.  * @param   string          $databases      database
  231.  * @param   string          $table          table
  232.  * @param   boolean|string  $tbl_is_group   $table is a table group
  233.  * @param   resource        $link           mysql link
  234.  * @return  array           list of tbales in given db(s)
  235.  */
  236. function PMA_DBI_get_tables_full($database, $table = false,
  237.     $tbl_is_group = false, $link = null)
  238. {
  239.     // prepare and check parameters
  240.     if ( ! is_array($database) ) {
  241.         $databases = array(addslashes($database));
  242.     } else {
  243.         $databases = array_map('addslashes', $database);
  244.     }
  245.  
  246.     $tables = array();
  247.  
  248.     if ( PMA_MYSQL_INT_VERSION >= 50002 ) {
  249.         // get table information from information_schema
  250.         if ( $table ) {
  251.             if ( true === $tbl_is_group ) {
  252.                 $sql_where_table = 'AND `TABLE_NAME` LIKE \''
  253.                     . PMA_escape_mysql_wildcards(addslashes($table)) . '%\'';
  254.             } elseif ( 'comment' === $tbl_is_group ) {
  255.                 $sql_where_table = 'AND `TABLE_COMMENT` LIKE \''
  256.                     . PMA_escape_mysql_wildcards(addslashes($table)) . '%\'';
  257.             } else {
  258.                 $sql_where_table = 'AND `TABLE_NAME` = \'' . addslashes($table) . '\'';
  259.             }
  260.         } else {
  261.             $sql_where_table = '';
  262.         }
  263.  
  264.         // for PMA bc:
  265.         // `SCHEMA_FIELD_NAME` AS `SHOW_TABLE_STATUS_FIELD_NAME`
  266.         $sql = '
  267.              SELECT *,
  268.                     `TABLE_SCHEMA`       AS `Db`,
  269.                     `TABLE_NAME`         AS `Name`,
  270.                     `ENGINE`             AS `Engine`,
  271.                     `ENGINE`             AS `Type`,
  272.                     `VERSION`            AS `Version`,
  273.                     `ROW_FORMAT`         AS `Row_format`,
  274.                     `TABLE_ROWS`         AS `Rows`,
  275.                     `AVG_ROW_LENGTH`     AS `Avg_row_length`,
  276.                     `DATA_LENGTH`        AS `Data_length`,
  277.                     `MAX_DATA_LENGTH`    AS `Max_data_length`,
  278.                     `INDEX_LENGTH`       AS `Index_length`,
  279.                     `DATA_FREE`          AS `Data_free`,
  280.                     `AUTO_INCREMENT`     AS `Auto_increment`,
  281.                     `CREATE_TIME`        AS `Create_time`,
  282.                     `UPDATE_TIME`        AS `Update_time`,
  283.                     `CHECK_TIME`         AS `Check_time`,
  284.                     `TABLE_COLLATION`    AS `Collation`,
  285.                     `CHECKSUM`           AS `Checksum`,
  286.                     `CREATE_OPTIONS`     AS `Create_options`,
  287.                     `TABLE_COMMENT`      AS `Comment`
  288.                FROM `information_schema`.`TABLES`
  289.               WHERE `TABLE_SCHEMA` IN (\'' . implode("', '", $databases) . '\')
  290.                 ' . $sql_where_table;
  291.         $tables = PMA_DBI_fetch_result($sql, array('TABLE_SCHEMA', 'TABLE_NAME'),
  292.             null, $link);
  293.         unset( $sql_where_table, $sql );
  294.     } else {
  295.         foreach ( $databases as $each_database ) {
  296.             if ( true === $tbl_is_group ) {
  297.                 $sql = 'SHOW TABLE STATUS FROM '
  298.                     . PMA_backquote($each_database)
  299.                     .' LIKE \'' . PMA_escape_mysql_wildcards(addslashes($table)) . '%\'';
  300.             } else {
  301.                 $sql = 'SHOW TABLE STATUS FROM '
  302.                     . PMA_backquote($each_database) . ';';
  303.             }
  304.             $each_tables = PMA_DBI_fetch_result($sql, 'Name', null, $link);
  305.             foreach ( $each_tables as $table_name => $each_table ) {
  306.                 if ( 'comment' === $tbl_is_group
  307.                   && 0 === strpos($each_table['Comment'], $table) )
  308.                 {
  309.                     // remove table from list
  310.                     unset( $each_tables[$table_name] );
  311.                     continue;
  312.                 }
  313.  
  314.                 if ( ! isset( $each_tables[$table_name]['Type'] )
  315.                   && isset( $each_tables[$table_name]['Engine'] ) ) {
  316.                     // pma BC, same parts of PMA still uses 'Type'
  317.                     $each_tables[$table_name]['Type']
  318.                         =& $each_tables[$table_name]['Engine'];
  319.                 } elseif ( ! isset( $each_tables[$table_name]['Engine'] )
  320.                   && isset( $each_tables[$table_name]['Type'] ) ) {
  321.                     // old MySQL reports Type, newer MySQL reports Engine
  322.                     $each_tables[$table_name]['Engine']
  323.                         =& $each_tables[$table_name]['Type'];
  324.                 }
  325.  
  326.                 // MySQL forward compatibility
  327.                 // so pma could use this array as if every server is of version >5.0
  328.                 $each_tables[$table_name]['TABLE_SCHEMA']      = $each_database;
  329.                 $each_tables[$table_name]['TABLE_NAME']        =& $each_tables[$table_name]['Name'];
  330.                 $each_tables[$table_name]['ENGINE']            =& $each_tables[$table_name]['Engine'];
  331.                 $each_tables[$table_name]['VERSION']           =& $each_tables[$table_name]['Version'];
  332.                 $each_tables[$table_name]['ROW_FORMAT']        =& $each_tables[$table_name]['Row_format'];
  333.                 $each_tables[$table_name]['TABLE_ROWS']        =& $each_tables[$table_name]['Rows'];
  334.                 $each_tables[$table_name]['AVG_ROW_LENGTH']    =& $each_tables[$table_name]['Avg_row_length'];
  335.                 $each_tables[$table_name]['DATA_LENGTH']       =& $each_tables[$table_name]['Data_length'];
  336.                 $each_tables[$table_name]['MAX_DATA_LENGTH']   =& $each_tables[$table_name]['Max_data_length'];
  337.                 $each_tables[$table_name]['INDEX_LENGTH']      =& $each_tables[$table_name]['Index_length'];
  338.                 $each_tables[$table_name]['DATA_FREE']         =& $each_tables[$table_name]['Data_free'];
  339.                 $each_tables[$table_name]['AUTO_INCREMENT']    =& $each_tables[$table_name]['Auto_increment'];
  340.                 $each_tables[$table_name]['CREATE_TIME']       =& $each_tables[$table_name]['Create_time'];
  341.                 $each_tables[$table_name]['UPDATE_TIME']       =& $each_tables[$table_name]['Update_time'];
  342.                 $each_tables[$table_name]['CHECK_TIME']        =& $each_tables[$table_name]['Check_time'];
  343.                 $each_tables[$table_name]['TABLE_COLLATION']   =& $each_tables[$table_name]['Collation'];
  344.                 $each_tables[$table_name]['CHECKSUM']          =& $each_tables[$table_name]['Checksum'];
  345.                 $each_tables[$table_name]['CREATE_OPTIONS']    =& $each_tables[$table_name]['Create_options'];
  346.                 $each_tables[$table_name]['TABLE_COMMENT']     =& $each_tables[$table_name]['Comment'];
  347.  
  348.                 if ( strtoupper( $each_tables[$table_name]['Comment'] ) === 'VIEW' ) {
  349.                     $each_tables[$table_name]['TABLE_TYPE'] = 'VIEW';
  350.                 } else {
  351.                     // TODO difference between 'TEMPORARY' and 'BASE TABLE'
  352.                     // but how to detect?
  353.                     $each_tables[$table_name]['TABLE_TYPE'] = 'BASE TABLE';
  354.                 }
  355.             }
  356.  
  357.             $tables[$each_database] = $each_tables;
  358.         }
  359.     }
  360.  
  361.     if ( $GLOBALS['cfg']['NaturalOrder'] ) {
  362.         foreach ( $tables as $key => $val ) {
  363.             uksort($tables[$key], 'strnatcasecmp');
  364.         }
  365.     }
  366.  
  367.     if (! is_array($database)) {
  368.         if (isset($tables[$database])) {
  369.             return $tables[$database];
  370.         } elseif (isset($tables[strtolower($database)])) {
  371.             // on windows with lower_case_table_names = 1
  372.             // MySQL returns
  373.             // with SHOW DATABASES or information_schema.SCHEMATA: `Test`
  374.             // but information_schema.TABLES gives `test`
  375.             // bug #1436171
  376.             // sf.net/tracker/?func=detail&aid=1436171&group_id=23067&atid=377408
  377.             return $tables[strtolower($database)];
  378.         } else {
  379.             return $tables;
  380.         }
  381.     } else {
  382.         return $tables;
  383.     }
  384. }
  385.  
  386. /**
  387.  * returns array with databases containing extended infos about them
  388.  *
  389.  * @param   string          $databases      database
  390.  * @param   boolean         $force_stats    retrieve stats also for MySQL < 5
  391.  * @param   resource        $link           mysql link
  392.  * @return  array       $databases
  393.  */
  394. function PMA_DBI_get_databases_full( $database = null, $force_stats = false, $link = null ) {
  395.  
  396.     // initialize to avoid errors when there are no databases
  397.     $databases = array();
  398.  
  399.     if ( PMA_MYSQL_INT_VERSION >= 50002 ) {
  400.         // get table information from information_schema
  401.         if ( $database ) {
  402.             $sql_where_schema = 'WHERE `SCHEMA_NAME` LIKE \''
  403.                 . addslashes( $database ) . '\'';
  404.         } else {
  405.             $sql_where_schema = '';
  406.         }
  407.  
  408.         // for PMA bc:
  409.         // `SCHEMA_FIELD_NAME` AS `SHOW_TABLE_STATUS_FIELD_NAME`
  410.         $sql = '
  411.              SELECT `information_schema`.`SCHEMATA`.*,
  412.                     COUNT(`information_schema`.`TABLES`.`TABLE_SCHEMA`)
  413.                         AS `SCHEMA_TABLES`,
  414.                     SUM(`information_schema`.`TABLES`.`TABLE_ROWS`)
  415.                         AS `SCHEMA_TABLE_ROWS`,
  416.                     SUM(`information_schema`.`TABLES`.`DATA_LENGTH`)
  417.                         AS `SCHEMA_DATA_LENGTH`,
  418.                     SUM(`information_schema`.`TABLES`.`MAX_DATA_LENGTH`)
  419.                         AS `SCHEMA_MAX_DATA_LENGTH`,
  420.                     SUM(`information_schema`.`TABLES`.`INDEX_LENGTH`)
  421.                         AS `SCHEMA_INDEX_LENGTH`,
  422.                     SUM(`information_schema`.`TABLES`.`DATA_LENGTH`
  423.                       + `information_schema`.`TABLES`.`INDEX_LENGTH`)
  424.                         AS `SCHEMA_LENGTH`,
  425.                     SUM(`information_schema`.`TABLES`.`DATA_FREE`)
  426.                         AS `SCHEMA_DATA_FREE`
  427.                FROM `information_schema`.`SCHEMATA`
  428.           LEFT JOIN `information_schema`.`TABLES`
  429.                  ON `information_schema`.`TABLES`.`TABLE_SCHEMA`
  430.                   = `information_schema`.`SCHEMATA`.`SCHEMA_NAME`
  431.               ' . $sql_where_schema . '
  432.            GROUP BY `information_schema`.`SCHEMATA`.`SCHEMA_NAME`';
  433.         $databases = PMA_DBI_fetch_result( $sql, 'SCHEMA_NAME', null, $link );
  434.         unset( $sql_where_schema, $sql );
  435.     } else {
  436.         foreach ( PMA_DBI_get_dblist( $link ) as $database_name ) {
  437.             // MySQL forward compatibility
  438.             // so pma could use this array as if every server is of version >5.0
  439.             $databases[$database_name]['SCHEMA_NAME']      = $database_name;
  440.  
  441.             if ( $force_stats ) {
  442.                 require_once 'mysql_charsets.lib.php';
  443.  
  444.                 $databases[$database_name]['DEFAULT_COLLATION_NAME']
  445.                     = PMA_getDbCollation( $database_name );
  446.  
  447.                 // get additonal info about tables
  448.                 $databases[$database_name]['SCHEMA_TABLES']          = 0;
  449.                 $databases[$database_name]['SCHEMA_TABLE_ROWS']      = 0;
  450.                 $databases[$database_name]['SCHEMA_DATA_LENGTH']     = 0;
  451.                 $databases[$database_name]['SCHEMA_MAX_DATA_LENGTH'] = 0;
  452.                 $databases[$database_name]['SCHEMA_INDEX_LENGTH']    = 0;
  453.                 $databases[$database_name]['SCHEMA_LENGTH']          = 0;
  454.                 $databases[$database_name]['SCHEMA_DATA_FREE']       = 0;
  455.  
  456.                 $res = PMA_DBI_query('SHOW TABLE STATUS FROM ' . PMA_backquote( $database_name ) . ';');
  457.                 while ( $row = PMA_DBI_fetch_assoc( $res ) ) {
  458.                     $databases[$database_name]['SCHEMA_TABLES']++;
  459.                     $databases[$database_name]['SCHEMA_TABLE_ROWS']
  460.                         += $row['Rows'];
  461.                     $databases[$database_name]['SCHEMA_DATA_LENGTH']
  462.                         += $row['Data_length'];
  463.                     $databases[$database_name]['SCHEMA_MAX_DATA_LENGTH']
  464.                         += $row['Max_data_length'];
  465.                     $databases[$database_name]['SCHEMA_INDEX_LENGTH']
  466.                         += $row['Index_length'];
  467.                     $databases[$database_name]['SCHEMA_DATA_FREE']
  468.                         += $row['Data_free'];
  469.                     $databases[$database_name]['SCHEMA_LENGTH']
  470.                         += $row['Data_length'] + $row['Index_length'];
  471.                 }
  472.                 PMA_DBI_free_result( $res );
  473.                 unset( $res );
  474.             }
  475.         }
  476.     }
  477.  
  478.     if ( $GLOBALS['cfg']['NaturalOrder'] ) {
  479.         uksort( $databases, 'strnatcasecmp' );
  480.     }
  481.  
  482.     return $databases;
  483. }
  484.  
  485. /**
  486.  * returns detailed array with all columns for given table in database,
  487.  * or all tables/databases
  488.  *
  489.  * @param   string  $database   name of database
  490.  * @param   string  $table      name of table to retrieve columns from
  491.  * @param   string  $column     name of specific column
  492.  * @param   mixed   $link       mysql link resource
  493.  */
  494. function PMA_DBI_get_columns_full($database = null, $table = null,
  495.     $column = null, $link = null)
  496. {
  497.     $columns = array();
  498.  
  499.     if ( PMA_MYSQL_INT_VERSION >= 50002 ) {
  500.         $sql_wheres = array();
  501.         $array_keys = array();
  502.  
  503.         // get columns information from information_schema
  504.         if ( null !== $database ) {
  505.             $sql_wheres[] = '`TABLE_SCHEMA` = \'' . addslashes($database) . '\' ';
  506.         } else {
  507.             $array_keys[] = 'TABLE_SCHEMA';
  508.         }
  509.         if (  null !== $table ) {
  510.             $sql_wheres[] = '`TABLE_NAME` = \'' . addslashes($table) . '\' ';
  511.         } else {
  512.             $array_keys[] = 'TABLE_NAME';
  513.         }
  514.         if (  null !== $column ) {
  515.             $sql_wheres[] = '`COLUMN_NAME` = \'' . addslashes($column) . '\' ';
  516.         } else {
  517.             $array_keys[] = 'COLUMN_NAME';
  518.         }
  519.  
  520.         // for PMA bc:
  521.         // `[SCHEMA_FIELD_NAME]` AS `[SHOW_FULL_COLUMNS_FIELD_NAME]`
  522.         $sql = '
  523.              SELECT *,
  524.                     `COLUMN_NAME`       AS `Field`,
  525.                     `COLUMN_TYPE`       AS `Type`,
  526.                     `COLLATION_NAME`    AS `Collation`,
  527.                     `IS_NULLABLE`       AS `Null`,
  528.                     `COLUMN_KEY`        AS `Key`,
  529.                     `COLUMN_DEFAULT`    AS `Default`,
  530.                     `EXTRA`             AS `Extra`,
  531.                     `PRIVILEGES`        AS `Privileges`,
  532.                     `COLUMN_COMMENT`    AS `Comment`
  533.                FROM `information_schema`.`COLUMNS`';
  534.         if ( count($sql_wheres) ) {
  535.             $sql .= "\n" . ' WHERE ' . implode(' AND ', $sql_wheres);
  536.         }
  537.  
  538.         $columns = PMA_DBI_fetch_result($sql, $array_keys, null, $link);
  539.         unset( $sql_wheres, $sql );
  540.     } else {
  541.         if ( null === $database ) {
  542.             $databases = PMA_DBI_get_dblist();
  543.             foreach ( $databases as $database ) {
  544.                 $columns[$database] = PMA_DBI_get_columns_full($database, null,
  545.                     null, $link);
  546.             }
  547.             return $columns;
  548.         } elseif ( null === $table ) {
  549.             $tables = PMA_DBI_get_tables($database);
  550.             foreach ( $tables as $table ) {
  551.                 $columns[$table] = PMA_DBI_get_columns_full(
  552.                     $database, $table, null, $link);
  553.             }
  554.             return $columns;
  555.         }
  556.  
  557.         $sql = 'SHOW FULL COLUMNS FROM '
  558.             . PMA_backquote($database) . '.' . PMA_backquote($table);
  559.         if ( null !== $column ) {
  560.             $sql .= " LIKE '" . $column . "'";
  561.         }
  562.  
  563.         $columns = PMA_DBI_fetch_result( $sql, 'Field', null, $link );
  564.  
  565.         $ordinal_position = 1;
  566.         foreach ( $columns as $column_name => $each_column ) {
  567.  
  568.             // MySQL forward compatibility
  569.             // so pma could use this array as if every server is of version >5.0
  570.             $columns[$column_name]['COLUMN_NAME']                 =& $columns[$column_name]['Field'];
  571.             $columns[$column_name]['COLUMN_TYPE']                 =& $columns[$column_name]['Type'];
  572.             $columns[$column_name]['COLLATION_NAME']              =& $columns[$column_name]['Collation'];
  573.             $columns[$column_name]['IS_NULLABLE']                 =& $columns[$column_name]['Null'];
  574.             $columns[$column_name]['COLUMN_KEY']                  =& $columns[$column_name]['Key'];
  575.             $columns[$column_name]['COLUMN_DEFAULT']              =& $columns[$column_name]['Default'];
  576.             $columns[$column_name]['EXTRA']                       =& $columns[$column_name]['Extra'];
  577.             $columns[$column_name]['PRIVILEGES']                  =& $columns[$column_name]['Privileges'];
  578.             $columns[$column_name]['COLUMN_COMMENT']              =& $columns[$column_name]['Comment'];
  579.  
  580.             $columns[$column_name]['TABLE_CATALOG']               = null;
  581.             $columns[$column_name]['TABLE_SCHEMA']                = $database;
  582.             $columns[$column_name]['TABLE_NAME']                  = $table;
  583.             $columns[$column_name]['ORDINAL_POSITION']            = $ordinal_position;
  584.             $columns[$column_name]['DATA_TYPE']                   =
  585.                 substr($columns[$column_name]['COLUMN_TYPE'], 0,
  586.                     strpos($columns[$column_name]['COLUMN_TYPE'], '('));
  587.             // @TODO guess CHARACTER_MAXIMUM_LENGTH from COLUMN_TYPE
  588.             $columns[$column_name]['CHARACTER_MAXIMUM_LENGTH']    = null;
  589.             // @TODO guess CHARACTER_OCTET_LENGTH from CHARACTER_MAXIMUM_LENGTH
  590.             $columns[$column_name]['CHARACTER_OCTET_LENGTH']      = null;
  591.             $columns[$column_name]['NUMERIC_PRECISION']           = null;
  592.             $columns[$column_name]['NUMERIC_SCALE']               = null;
  593.             $columns[$column_name]['CHARACTER_SET_NAME']          =
  594.                 substr($columns[$column_name]['COLLATION_NAME'], 0,
  595.                     strpos($columns[$column_name]['COLLATION_NAME'], '_'));
  596.  
  597.             $ordinal_position++;
  598.         }
  599.  
  600.         if ( null !== $column ) {
  601.             reset($columns);
  602.             $columns = current($columns);
  603.         }
  604.     }
  605.  
  606.     return $columns;
  607. }
  608.  
  609. /**
  610.  * @TODO should only return columns names, for more info use PMA_DBI_get_columns_full()
  611.  *
  612.  * @param   string  $database   name of database
  613.  * @param   string  $table      name of table to retrieve columns from
  614.  * @param   mixed   $link       mysql link resource
  615.  */
  616. function PMA_DBI_get_fields($database, $table, $link = null)
  617. {
  618.     // here we use a try_query because when coming from
  619.     // tbl_create + tbl_properties.inc.php, the table does not exist
  620.     $fields = PMA_DBI_fetch_result(
  621.         'SHOW FULL COLUMNS
  622.         FROM ' . PMA_backquote($database) . '.' . PMA_backquote($table),
  623.         null, null, $link);
  624.     if ( ! is_array($fields) || count($fields) < 1 ) {
  625.         return false;
  626.     }
  627.     return $fields;
  628. }
  629.  
  630. /**
  631.  * returns value of given mysql server variable
  632.  *
  633.  * @param   string  $var    mysql server variable name
  634.  * @param   int     $type   PMA_DBI_GETVAR_SESSION|PMA_DBI_GETVAR_GLOBAL
  635.  * @param   mixed   $link   mysql link resource|object
  636.  * @return  mixed   value for mysql server variable
  637.  */
  638. function PMA_DBI_get_variable($var, $type = PMA_DBI_GETVAR_SESSION, $link = null)
  639. {
  640.     if ($link === null) {
  641.         if (isset($GLOBALS['userlink'])) {
  642.             $link = $GLOBALS['userlink'];
  643.         } else {
  644.             return false;
  645.         }
  646.     }
  647.     if (PMA_MYSQL_INT_VERSION < 40002) {
  648.         $type = 0;
  649.     }
  650.     switch ($type) {
  651.         case PMA_DBI_GETVAR_SESSION:
  652.             $modifier = ' SESSION';
  653.             break;
  654.         case PMA_DBI_GETVAR_GLOBAL:
  655.             $modifier = ' GLOBAL';
  656.             break;
  657.         default:
  658.             $modifier = '';
  659.     }
  660.     return PMA_DBI_fetch_value(
  661.         'SHOW' . $modifier . ' VARIABLES LIKE \'' . $var . '\';', 0, 1, $link);
  662. }
  663.  
  664. /**
  665.  * @uses    ./libraries/charset_conversion.lib.php
  666.  * @uses    PMA_DBI_QUERY_STORE
  667.  * @uses    PMA_REMOVED_NON_UTF_8
  668.  * @uses    PMA_MYSQL_INT_VERSION
  669.  * @uses    PMA_MYSQL_STR_VERSION
  670.  * @uses    PMA_DBI_GETVAR_SESSION
  671.  * @uses    PMA_DBI_fetch_value()
  672.  * @uses    PMA_DBI_query()
  673.  * @uses    PMA_DBI_get_variable()
  674.  * @uses    $GLOBALS['collation_connection']
  675.  * @uses    $GLOBALS['charset_connection']
  676.  * @uses    $GLOBALS['available_languages']
  677.  * @uses    $GLOBALS['mysql_charset_map']
  678.  * @uses    $GLOBALS['charset']
  679.  * @uses    $GLOBALS['lang']
  680.  * @uses    $GLOBALS['cfg']['Lang']
  681.  * @uses    $GLOBALS['cfg']['ColumnTypes']
  682.  * @uses    defined()
  683.  * @uses    explode()
  684.  * @uses    sprintf()
  685.  * @uses    intval()
  686.  * @uses    define()
  687.  * @uses    defined()
  688.  * @uses    substr()
  689.  * @uses    count()
  690.  * @param   mixed   $link   mysql link resource|object
  691.  * @param   boolean $is_controluser
  692.  */
  693. function PMA_DBI_postConnect($link, $is_controluser = false)
  694. {
  695.     if (!defined('PMA_MYSQL_INT_VERSION')) {
  696.         $mysql_version = PMA_DBI_fetch_value(
  697.             'SELECT VERSION()', 0, 0, $link, PMA_DBI_QUERY_STORE);
  698.         if ( $mysql_version ) {
  699.             $match = explode('.', $mysql_version);
  700.             define('PMA_MYSQL_INT_VERSION',
  701.                 (int) sprintf('%d%02d%02d', $match[0], $match[1],
  702.                         intval($match[2])));
  703.             define('PMA_MYSQL_STR_VERSION', $mysql_version);
  704.             unset($mysql_version, $match);
  705.         } else {
  706.             define('PMA_MYSQL_INT_VERSION', 32332);
  707.             define('PMA_MYSQL_STR_VERSION', '3.23.32');
  708.         }
  709.     }
  710.  
  711.     if (!defined('PMA_ENGINE_KEYWORD')) {
  712.         if (PMA_MYSQL_INT_VERSION >= 40102) {
  713.             define('PMA_ENGINE_KEYWORD','ENGINE');
  714.         } else {
  715.             define('PMA_ENGINE_KEYWORD','TYPE');
  716.         }
  717.     }
  718.  
  719.     if (PMA_MYSQL_INT_VERSION >= 40100) {
  720.  
  721.         // If $lang is defined and we are on MySQL >= 4.1.x,
  722.         // we auto-switch the lang to its UTF-8 version (if it exists and user
  723.         // didn't force language)
  724.         if ( !empty($GLOBALS['lang'])
  725.           && (substr($GLOBALS['lang'], -5) != 'utf-8')
  726.           && !isset($GLOBALS['cfg']['Lang']) ) {
  727.             $lang_utf_8_version =
  728.                 substr($GLOBALS['lang'], 0, strpos($GLOBALS['lang'], '-'))
  729.                 . '-utf-8';
  730.             if (!empty($GLOBALS['available_languages'][$lang_utf_8_version])) {
  731.                 $GLOBALS['lang'] = $lang_utf_8_version;
  732.                 $GLOBALS['charset'] = 'utf-8';
  733.             }
  734.         }
  735.  
  736.         // and we remove the non-UTF-8 choices to avoid confusion
  737.         if (!defined('PMA_REMOVED_NON_UTF_8')) {
  738.             foreach ( $GLOBALS['available_languages'] as $each_lang => $dummy ) {
  739.                 if ( substr($each_lang, -5) != 'utf-8' ) {
  740.                     unset( $GLOBALS['available_languages'][$each_lang] );
  741.                 }
  742.             }
  743.             define('PMA_REMOVED_NON_UTF_8', 1);
  744.         }
  745.  
  746.         $mysql_charset = $GLOBALS['mysql_charset_map'][$GLOBALS['charset']];
  747.         if ( $is_controluser
  748.           || empty($GLOBALS['collation_connection'])
  749.           || (strpos($GLOBALS['collation_connection'], '_')
  750.                 ? substr($GLOBALS['collation_connection'], 0, strpos($GLOBALS['collation_connection'], '_'))
  751.                 : $GLOBALS['collation_connection']) == $mysql_charset) {
  752.  
  753.             PMA_DBI_query('SET NAMES ' . $mysql_charset . ';', $link,
  754.                 PMA_DBI_QUERY_STORE);
  755.         } else {
  756.             PMA_DBI_query('SET CHARACTER SET ' . $mysql_charset . ';', $link,
  757.                 PMA_DBI_QUERY_STORE);
  758.         }
  759.         if (!empty($GLOBALS['collation_connection'])) {
  760.             PMA_DBI_query('SET collation_connection = \'' . $GLOBALS['collation_connection'] . '\';',
  761.                 $link, PMA_DBI_QUERY_STORE);
  762.         }
  763.         if (!$is_controluser) {
  764.             $GLOBALS['collation_connection'] = PMA_DBI_get_variable('collation_connection',
  765.                 PMA_DBI_GETVAR_SESSION, $link);
  766.             $GLOBALS['charset_connection']   = PMA_DBI_get_variable('character_set_connection',
  767.                 PMA_DBI_GETVAR_SESSION, $link);
  768.         }
  769.  
  770.         // Add some field types to the list, this needs to be done once per session!
  771.         if ($GLOBALS['cfg']['ColumnTypes'][count($GLOBALS['cfg']['ColumnTypes']) - 1] != 'VARBINARY') {
  772.             $GLOBALS['cfg']['ColumnTypes'][] = 'BINARY';
  773.             $GLOBALS['cfg']['ColumnTypes'][] = 'VARBINARY';
  774.         }
  775.  
  776.     } else {
  777.         require_once('./libraries/charset_conversion.lib.php');
  778.     }
  779. }
  780.  
  781. /**
  782.  * returns a single value from the given result or query,
  783.  * if the query or the result has more than one row or field
  784.  * the first field of the first row is returned
  785.  *
  786.  * <code>
  787.  * $sql = 'SELECT `name` FROM `user` WHERE `id` = 123';
  788.  * $user_name = PMA_DBI_fetch_value( $sql );
  789.  * // produces
  790.  * // $user_name = 'John Doe'
  791.  * </code>
  792.  *
  793.  * @uses    is_string()
  794.  * @uses    is_int()
  795.  * @uses    PMA_DBI_try_query()
  796.  * @uses    PMA_DBI_num_rows()
  797.  * @uses    PMA_DBI_fetch_row()
  798.  * @uses    PMA_DBI_fetch_assoc()
  799.  * @uses    PMA_DBI_free_result()
  800.  * @param   string|mysql_result $result query or mysql result
  801.  * @param   integer             $row_number row to fetch the value from,
  802.  *                                      starting at 0, with 0 beeing default
  803.  * @param   integer|string      $field  field to fetch the value from,
  804.  *                                      starting at 0, with 0 beeing default
  805.  * @param   resource            $link   mysql link
  806.  * @param   mixed               $options
  807.  * @return  mixed               value of first field in first row from result
  808.  *                              or false if not found
  809.  */
  810. function PMA_DBI_fetch_value( $result, $row_number = 0, $field = 0, $link = null, $options = 0 ) {
  811.     $value = false;
  812.  
  813.     if ( is_string( $result ) ) {
  814.         $result = PMA_DBI_try_query( $result, $link, $options | PMA_DBI_QUERY_STORE );
  815.     }
  816.  
  817.     // return false if result is empty or false
  818.     // or requested row is larger than rows in result
  819.     if ( PMA_DBI_num_rows( $result ) < ( $row_number + 1 ) ) {
  820.         return $value;
  821.     }
  822.  
  823.     // if $field is an integer use non associative mysql fetch function
  824.     if ( is_int( $field ) ) {
  825.         $fetch_function = 'PMA_DBI_fetch_row';
  826.     } else {
  827.         $fetch_function = 'PMA_DBI_fetch_assoc';
  828.     }
  829.  
  830.     // get requested row
  831.     for ( $i = 0; $i <= $row_number; $i++ ) {
  832.         $row = $fetch_function( $result );
  833.     }
  834.     PMA_DBI_free_result( $result );
  835.  
  836.     // return requested field
  837.     if ( isset( $row[$field] ) ) {
  838.         $value = $row[$field];
  839.     }
  840.     unset( $row );
  841.  
  842.     return $value;
  843. }
  844.  
  845. /**
  846.  * returns only the first row from the result
  847.  *
  848.  * <code>
  849.  * $sql = 'SELECT * FROM `user` WHERE `id` = 123';
  850.  * $user = PMA_DBI_fetch_single_row( $sql );
  851.  * // produces
  852.  * // $user = array( 'id' => 123, 'name' => 'John Doe' )
  853.  * </code>
  854.  *
  855.  * @uses    is_string()
  856.  * @uses    PMA_DBI_try_query()
  857.  * @uses    PMA_DBI_num_rows()
  858.  * @uses    PMA_DBI_fetch_row()
  859.  * @uses    PMA_DBI_fetch_assoc()
  860.  * @uses    PMA_DBI_fetch_array()
  861.  * @uses    PMA_DBI_free_result()
  862.  * @param   string|mysql_result $result query or mysql result
  863.  * @param   string              $type   NUM|ASSOC|BOTH
  864.  *                                      returned array should either numeric
  865.  *                                      associativ or booth
  866.  * @param   resource            $link   mysql link
  867.  * @param   mixed               $options
  868.  * @return  array|boolean       first row from result
  869.  *                              or false if result is empty
  870.  */
  871. function PMA_DBI_fetch_single_row( $result, $type = 'ASSOC', $link = null, $options = 0 ) {
  872.     if ( is_string( $result ) ) {
  873.         $result = PMA_DBI_try_query( $result, $link, $options | PMA_DBI_QUERY_STORE );
  874.     }
  875.  
  876.     // return null if result is empty or false
  877.     if ( ! PMA_DBI_num_rows( $result ) ) {
  878.         return false;
  879.     }
  880.  
  881.     switch ( $type ) {
  882.         case 'NUM' :
  883.             $fetch_function = 'PMA_DBI_fetch_row';
  884.             break;
  885.         case 'ASSOC' :
  886.             $fetch_function = 'PMA_DBI_fetch_assoc';
  887.             break;
  888.         case 'BOTH' :
  889.         default :
  890.             $fetch_function = 'PMA_DBI_fetch_array';
  891.             break;
  892.     }
  893.  
  894.     $row = $fetch_function( $result );
  895.     PMA_DBI_free_result( $result );
  896.     return $row;
  897. }
  898.  
  899. /**
  900.  * returns all rows in the resultset in one array
  901.  *
  902.  * <code>
  903.  * $sql = 'SELECT * FROM `user`';
  904.  * $users = PMA_DBI_fetch_result( $sql );
  905.  * // produces
  906.  * // $users[] = array( 'id' => 123, 'name' => 'John Doe' )
  907.  *
  908.  * $sql = 'SELECT `id`, `name` FROM `user`';
  909.  * $users = PMA_DBI_fetch_result( $sql, 'id' );
  910.  * // produces
  911.  * // $users['123'] = array( 'id' => 123, 'name' => 'John Doe' )
  912.  *
  913.  * $sql = 'SELECT `id`, `name` FROM `user`';
  914.  * $users = PMA_DBI_fetch_result( $sql, 0 );
  915.  * // produces
  916.  * // $users['123'] = array( 0 => 123, 1 => 'John Doe' )
  917.  *
  918.  * $sql = 'SELECT `id`, `name` FROM `user`';
  919.  * $users = PMA_DBI_fetch_result( $sql, 'id', 'name' );
  920.  * // or
  921.  * $users = PMA_DBI_fetch_result( $sql, 0, 1 );
  922.  * // produces
  923.  * // $users['123'] = 'John Doe'
  924.  *
  925.  * $sql = 'SELECT `name` FROM `user`';
  926.  * $users = PMA_DBI_fetch_result( $sql );
  927.  * // produces
  928.  * // $users[] = 'John Doe'
  929.  * </code>
  930.  *
  931.  * @uses    is_string()
  932.  * @uses    is_int()
  933.  * @uses    PMA_DBI_try_query()
  934.  * @uses    PMA_DBI_num_rows()
  935.  * @uses    PMA_DBI_num_fields()
  936.  * @uses    PMA_DBI_fetch_row()
  937.  * @uses    PMA_DBI_fetch_assoc()
  938.  * @uses    PMA_DBI_free_result()
  939.  * @param   string|mysql_result $result query or mysql result
  940.  * @param   string|integer      $key    field-name or offset
  941.  *                                      used as key for array
  942.  * @param   string|integer      $value  value-name or offset
  943.  *                                      used as value for array
  944.  * @param   resource            $link   mysql link
  945.  * @param   mixed               $options
  946.  * @return  array               resultrows or values indexed by $key
  947.  */
  948. function PMA_DBI_fetch_result( $result, $key = null, $value = null,
  949.     $link = null, $options = 0 )
  950. {
  951.     $resultrows = array();
  952.  
  953.     if ( is_string($result) ) {
  954.         $result = PMA_DBI_try_query($result, $link, $options);
  955.     }
  956.  
  957.     // return empty array if result is empty or false
  958.     if ( ! $result ) {
  959.         return $resultrows;
  960.     }
  961.  
  962.     $fetch_function = 'PMA_DBI_fetch_assoc';
  963.  
  964.     // no nested array if only one field is in result
  965.     if ( null === $key && 1 === PMA_DBI_num_fields($result) ) {
  966.         $value = 0;
  967.         $fetch_function = 'PMA_DBI_fetch_row';
  968.     }
  969.  
  970.     // if $key is an integer use non associative mysql fetch function
  971.     if ( is_int($key) ) {
  972.         $fetch_function = 'PMA_DBI_fetch_row';
  973.     }
  974.  
  975.     if ( null === $key && null === $value ) {
  976.         while ( $row = $fetch_function($result) ) {
  977.             $resultrows[] = $row;
  978.         }
  979.     } elseif ( null === $key ) {
  980.         while ( $row = $fetch_function($result) ) {
  981.             $resultrows[] = $row[$value];
  982.         }
  983.     } elseif ( null === $value ) {
  984.         if ( is_array($key) ) {
  985.             while ( $row = $fetch_function($result) ) {
  986.                 $result_target =& $resultrows;
  987.                 foreach ( $key as $key_index ) {
  988.                     if ( ! isset( $result_target[$row[$key_index]] ) ) {
  989.                         $result_target[$row[$key_index]] = array();
  990.                     }
  991.                     $result_target =& $result_target[$row[$key_index]];
  992.                 }
  993.                 $result_target = $row;
  994.             }
  995.         } else {
  996.             while ( $row = $fetch_function($result) ) {
  997.                 $resultrows[$row[$key]] = $row;
  998.             }
  999.         }
  1000.     } else {
  1001.         if ( is_array($key) ) {
  1002.             while ( $row = $fetch_function($result) ) {
  1003.                 $result_target =& $resultrows;
  1004.                 foreach ( $key as $key_index ) {
  1005.                     if ( ! isset( $result_target[$row[$key_index]] ) ) {
  1006.                         $result_target[$row[$key_index]] = array();
  1007.                     }
  1008.                     $result_target =& $result_target[$row[$key_index]];
  1009.                 }
  1010.                 $result_target = $row[$value];
  1011.             }
  1012.         } else {
  1013.             while ( $row = $fetch_function($result) ) {
  1014.                 $resultrows[$row[$key]] = $row[$value];
  1015.             }
  1016.         }
  1017.     }
  1018.  
  1019.     PMA_DBI_free_result($result);
  1020.     return $resultrows;
  1021. }
  1022.  
  1023. /**
  1024.  * return default table engine for given database
  1025.  *
  1026.  * @return  string  default table engine
  1027.  */
  1028. function PMA_DBI_get_default_engine()
  1029. {
  1030.     if ( PMA_MYSQL_INT_VERSION > 50002 ) {
  1031.         return PMA_DBI_fetch_value( 'SHOW VARIABLES LIKE \'storage_engine\';', 0, 1 );
  1032.     } else {
  1033.         return PMA_DBI_fetch_value( 'SHOW VARIABLES LIKE \'table_type\';', 0, 1 );
  1034.     }
  1035. }
  1036.  
  1037. ?>
  1038.